﻿/*
ID: pager.js
History
	0.1(2010-10-29) 파일생성 - soapiece
	0.2(2010-11-24) option 일부 항목 이름 변경 및 내부 로직 수정 - soapiece
	0.3(2010-12-07) 첫 페이지가 숫자가 큰 페이지가 되도록하는 기능 추가 - soapiece
	0.4(2010-12-09) 네비게이션 버튼 구조 변경 - soapiece
	0.5(2010-12-10) viewPrevNextBtn 옵션 삭제 - soapiece

Description
	페이징 기능을 하는 부분을 랜더링하고 선택한 페이지로 이동할 수 있는 위젯.
	
	options
		currentPageNo: 현재 페이지 번호
		totalCount: 전체 리스트의 갯수
		blockSize: 랜더링 되는 페이지 번호의 갯수
		pageSize: 한 페이지당 들어가는 컨텐츠 갯수
		firstPageNo: 첫번째 페이지 번호
		prevPageNo: 현재 페이징 리스트 보다 작은 페이지 중 가장 큰 페이지 번호( 앞블럭의 마지막 페이지 번호 ) 
		nextPageNo: 현재 페이징 리스트 보다 큰 페이지 중 가장 작은 페이지 번호( 뒷블럭의 첫 페이지 번호 )
		lastPageNo: 마지막 페이지 번호
		reverse: 첫 페이지가 숫자가 큰 페이지가 되도록 하는 옵션
		useCallback: callback을 사용할지 여부(true인 경우 페이지 이동 없음)
		baseUrl: 페이지 이동시 이동할 기본 경로
		firstBtn: 첫번째 페이지 버튼(html 가능)
		prevBtn: 이전 페이지 버튼(html 가능)
		nextBtn: 다음 페이지 버튼(html 가능)
		lastBtn: 마지막 페이지 버튼(html 가능)
		noBtnWrapper: 번호버튼들을 wrapping하는 객체(html 가능)
		currentPageNoClassName: 현재 페이지의 클레스 이름
		callback: 각 버튼을 클릭했을때 호출되는 콜백 함수
	
	method
		update( {전체 리스트갯수}, {현재 페이지 번호} ): 새로 랜더링 해야 되는 경우 사용. 보통 callback을 통해 비동기로 리스트를 새로 가져온 이후 호출시 사용.
		
	ToDo
		링크를 이용한 페이지 이동의 경우 구현 상세화. 아직까지는 사용하지 않고 있음.
		
Dependency
	jquery.js(1.4.3)
	jquery.ui.js(1.8.5)
*/
( function( $ ) {

$.widget( "ui.pager", {
	options: {
		currentPageNo: 1,
		totalCount: 0,
        blockSize: 10,
        pageSize: 10,
        firstPageNo: 1,
        prevPageNo: 0,
        nextPageNo: 0,
        lastPageNo: 1,
        reverse: false,
        useCallback: true,
        baseUrl: "",
		firstBtn: "<a href=\"#\" class=\"pagerBt first\"><span>처음</span></a>&nbsp;&nbsp;",
		prevBtn: "<a href=\"#\" class=\"pagerBt prev\"><span>이전</span></a>&nbsp;&nbsp;",
		nextBtn: "&nbsp;&nbsp;<a href=\"#\" class=\"pagerBt next\"><span>다음</span></a>",
		lastBtn: "&nbsp;&nbsp;<a href=\"#\" class=\"pagerBt last\"><span>마지막</span></a>",
		noBtnWrapper: "<span class=\"pagerNum\" />",
		currentPageNoClassName: "current",
		callback: function( no ) {
		}
	},
	update: function( totalCount ) {
		var self = this;
		self.options.totalCount = totalCount;
		self._update();
	},
	_create: function() {
	},
	_init: function() {
		var self = this;
		self._calData();
	},
	_update: function() {
		var self = this;
		self._calData();
		self._render();
	},
	_calData: function() {
		var self = this;
		self.options.lastPageNo = parseInt( ( self.options.totalCount - 1 ) / self.options.pageSize, 10 ) + 1;
		self.options.prevPageNo = parseInt( ( self.options.currentPageNo - 1 ) / self.options.blockSize, 10 ) * self.options.blockSize;
		
		if( ( self.options.prevPageNo + self.options.blockSize ) < self.options.lastPageNo ) {
			self.options.nextPageNo = self.options.prevPageNo + self.options.blockSize + 1;
		} else {
			self.options.nextPageNo = 0;
		}
	},
	_callback: function( no ) {
		var self = this;
		if ( no > 0 && no <= self.options.lastPageNo ) {
			self.options.callback( no );
		}
	},
	_render: function() {
		var self = this;
		self.element.empty();
		
		//콜백함수로 처리되는 경우
		if( self.options.useCallback ) {
			if( !self.options.reverse ) {
				$( self.options.firstBtn ).bind( "click", function( e ) {
					self.options.currentPageNo = self.options.firstPageNo;
					self._callback( self.options.firstPageNo );
					return false;
				} )
				.appendTo( self.element );
				
				$( self.options.prevBtn ).bind( "click", function( e ) {
					if( self.options.prevPageNo > 0) {
						self.options.currentPageNo = self.options.prevPageNo;
						self._callback( self.options.prevPageNo );
					}
					return false;
				} )
				.appendTo( self.element );
				
				var noBtnWrapper = $( self.options.noBtnWrapper );
				
				var tempNo = 0;
				for( var i = 0; i < self.options.blockSize && tempNo < self.options.lastPageNo; i++ ) {
					tempNo = self.options.prevPageNo + i + 1;
					var objNo = $( "<a />" );
					objNo.data( { "no": tempNo } )
					.attr( "href", "#" )
					.bind( "click", function( e ) {
						var no = $( this ).data( "no" );
						self.options.currentPageNo = no;
						self._callback( no );
						return false;
					} )
					.append( tempNo );
					if( tempNo == self.options.currentPageNo ) {
						objNo.addClass( self.options.currentPageNoClassName );
					}
					noBtnWrapper.append( objNo );
				}
				self.element.append( noBtnWrapper );
				
				$( self.options.nextBtn ).bind( "click", function( e ) {
					if( self.options.nextPageNo > 0 ) {
						self.options.currentPageNo = self.options.nextPageNo;
						self._callback( self.options.nextPageNo );
					}
					return false;
				} )
				.appendTo( self.element );
				
				$( self.options.lastBtn ).bind( "click", function( e ) {
					self.options.currentPageNo = self.options.lastPageNo;
					self._callback( self.options.lastPageNo );
					return false;
				} )
				.appendTo( self.element );
			} else {
				$( self.options.firstBtn ).bind( "click", function( e ) {
					self.options.currentPageNo = self.options.lastPageNo;
					self._callback( self.options.lastPageNo );
					return false;
				} )
				.appendTo( self.element );
				
				$( self.options.prevBtn ).bind( "click", function( e ) {
					if( self.options.nextPageNo > 0) {
						self.options.currentPageNo = self.options.nextPageNo;
						self._callback( self.options.nextPageNo );
					}
					return false;
				} )
				.appendTo( self.element );
				
				var noBtnWrapper = $( self.options.noBtnWrapper );
				
				var tempNo = 0;
				var tempPageNo = 0;
				for( var i = 0; i < self.options.blockSize && tempNo < self.options.lastPageNo; i++ ) {
					tempNo = self.options.prevPageNo + i + 1;
					tempPageNo = self.options.lastPageNo - tempNo + 1;
					var objNo = $( "<a />" );
					objNo.data( { "no": tempNo } )
					.attr( "href", "#" )
					.bind( "click", function( e ) {
						var no = $( this ).data( "no" );
						self.options.currentPageNo = no;
						self._callback( no );
						return false;
					} )
					.append( tempPageNo );
					if( tempNo == self.options.currentPageNo ) {
						objNo.addClass( self.options.currentPageNoClassName );
					}
					noBtnWrapper.prepend( objNo );
				}
				self.element.append( noBtnWrapper );
				
				$( self.options.nextBtn ).bind( "click", function( e ) {
					if( self.options.prevPageNo > 0 ) {
						self.options.currentPageNo = self.options.prevPageNo;
						self._callback( self.options.prevPageNo );
					}
					return false;
				} )
				.appendTo( self.element );
				
				$( self.options.lastBtn ).bind( "click", function( e ) {
					self.options.currentPageNo = self.options.firstPageNo;
					self._callback( self.options.firstPageNo );
					return false;
				} )
				.appendTo( self.element );
			}
		//페이지 링크로 처리되는 경우
		} else {
			if( !self.options.reverse ) {
				$( self.options.firstBtn )
				.attr( "href", self.options.baseUrl + self.options.firstPageNo )
				.appendTo( self.element );
				
				if( self.options.prevPageNo > 0 ) {
					$( self.options.prevBtn )
					.attr( "href", self.options.baseUrl + self.options.prevPageNo );
				}
				self.element.append( self.options.prevBtn );
				
				var noBtnWrapper = $( self.options.noBtnWrapper );
				
				var tempNo = 0;
				for( var i = 0; i < self.options.blockSize && tempNo < self.options.lastPageNo; i++ ) {
					tempNo = self.options.prevPageNo + i + 1;
					var objNo = $( "<a />" );
					objNo.attr( "href", self.options.baseUrl + tempNo )
					.append( tempNo );
					if ( self.options.currentPageNo == tempNo ) {
						noBtnWrapper.append( objNo.addClass( self.options.currentPageNoClassName ) );
					} else {
						noBtnWrapper.append( objNo );
					}
				}
				
				self.element.append( noBtnWrapper );
				
				if( self.options.nextPageNo > 0 ) {
					$( self.options.nextBtn )
					.attr( "href", self.options.baseUrl + self.options.nextPageNo );
				}
				self.element.append( self.options.nextBtn );
				
				$( self.options.lastBtn )
				.attr( "href", self.options.baseUrl + self.options.lastPageNo )
				.appendTo( self.element );
			} else {
				$( self.options.firstBtn )
				.attr( "href", self.options.baseUrl + self.options.lastPageNo )
				.appendTo( self.element );
				
				if( self.options.prevPageNo > 0 ) {
					$( self.options.prevBtn )
					.attr( "href", self.options.baseUrl + self.options.nextPageNo );
				}
				self.element.append( self.options.prevBtn );
				
				var noBtnWrapper = $( self.options.noBtnWrapper );
				
				var tempNo = 0;
				var tempPageNo = 0;
				for( var i = 0; i < self.options.blockSize && tempNo < self.options.lastPageNo; i++ ) {
					tempNo = self.options.prevPageNo + i + 1;
					tempPageNo = self.options.lastPageNo - tempNo + 1;
					var objNo = $( "<a />" );
					objNo.attr( "href", self.options.baseUrl + tempNo )
					.prepend( tempPageNo );
					if ( self.options.currentPageNo == tempNo ) {
						noBtnWrapper.append( objNo.addClass( self.options.currentPageNoClassName ) );
					} else {
						noBtnWrapper.append( objNo );
					}
				}
				
				self.element.append( noBtnWrapper );
				
				if( self.options.nextPageNo > 0 ) {
					$( self.options.nextBtn )
					.attr( "href", self.options.baseUrl + self.options.prevPageNo );
				}
				self.element.append( self.options.nextBtn );
				
				$( self.options.lastBtn )
				.attr( "href", self.options.baseUrl + self.options.firstPageNo )
				.appendTo( self.element );
			}
		}
	}
} );

} )( jQuery );
